"""Helpers for referring to React Native open source code.

This lets us build React Native:
 - At Facebook by running buck from the root of the fb repo
 - Outside of Facebook by running buck in the root of the git repo
"""
# @lint-ignore-every SKYLINT

IS_OSS_BUILD = True

GLOG_DEP = "//ReactAndroid/build/third-party-ndk/glog:glog"

INSPECTOR_FLAGS = []
DEBUG_PREPROCESSOR_FLAGS = []

APPLE_JSC_INTERNAL_DEPS = []
APPLE_JSC_DEPS = []

ANDROID_JSC_INTERNAL_DEPS = [
    '//native/third-party/jsc:jsc',
    '//native/third-party/jsc:jsc_legacy_profiler',
]
ANDROID_JSC_DEPS = ANDROID_JSC_INTERNAL_DEPS
ANDROID = "Android"

YOGA_TARGET = '//ReactAndroid/src/main/java/com/facebook:yoga'
FBGLOGINIT_TARGET = '//ReactAndroid/src/main/jni/first-party/fbgloginit:fbgloginit'
FBJNI_TARGET = '//ReactAndroid/src/main/jni/first-party/fb:jni'
JNI_TARGET = '//ReactAndroid/src/main/jni/first-party/jni-hack:jni-hack'
KEYSTORE_TARGET = '//keystores:debug'

with allow_unsafe_import():
    import os


# Building is not supported in OSS right now
def rn_xplat_cxx_library(name, **kwargs):
    new_kwargs = {
        k: v
        for k, v in kwargs.items()
        if k.startswith("exported_")
    }

    native.cxx_library(
        name=name,
        visibility=kwargs.get("visibility", []),
        **new_kwargs
    )


# Example: react_native_target('java/com/facebook/react/common:common')
def react_native_target(path):
    return '//ReactAndroid/src/main/' + path


# Example: react_native_xplat_target('bridge:bridge')
def react_native_xplat_target(path):
    return '//ReactCommon/' + path


# Example: react_native_tests_target('java/com/facebook/react/modules:modules')
def react_native_tests_target(path):
    return '//ReactAndroid/src/test/' + path


# Example: react_native_integration_tests_target('java/com/facebook/react/testing:testing')
def react_native_integration_tests_target(path):
    return '//ReactAndroid/src/androidTest/' + path


# Helper for referring to non-RN code from RN OSS code.
# Example: react_native_dep('java/com/facebook/systrace:systrace')
def react_native_dep(path):
    return '//ReactAndroid/src/main/' + path


# React property preprocessor
def rn_android_library(name, deps=[], plugins=[], *args, **kwargs):

    if react_native_target(
        'java/com/facebook/react/uimanager/annotations:annotations'
    ) in deps and name != 'processing':
        react_property_plugins = [
            react_native_target(
                'java/com/facebook/react/processing:processing'
            ),
        ]

        plugins = list(set(plugins + react_property_plugins))

    if react_native_target(
        'java/com/facebook/react/module/annotations:annotations'
    ) in deps and name != 'processing':
        react_module_plugins = [
            react_native_target(
                'java/com/facebook/react/module/processing:processing'
            ),
        ]

        plugins = list(set(plugins + react_module_plugins))

    native.android_library(name=name, deps=deps, plugins=plugins, *args, **kwargs)


def rn_android_binary(*args, **kwargs):
    native.android_binary(*args, **kwargs)


def rn_android_build_config(*args, **kwargs):
    native.android_build_config(*args, **kwargs)


def rn_android_resource(*args, **kwargs):
    native.android_resource(*args, **kwargs)


def rn_android_prebuilt_aar(*args, **kwargs):
    native.android_prebuilt_aar(*args, **kwargs)


def rn_java_library(*args, **kwargs):
    native.java_library(*args, **kwargs)


def rn_java_annotation_processor(*args, **kwargs):
    native.java_annotation_processor(*args, **kwargs)


def rn_prebuilt_native_library(*args, **kwargs):
    native.prebuilt_native_library(*args, **kwargs)


def rn_prebuilt_jar(*args, **kwargs):
    native.prebuilt_jar(*args, **kwargs)


def rn_robolectric_test(name, srcs, vm_args=None, *args, **kwargs):
    vm_args = vm_args or []

    # We may need to create buck-out/gen/ if we're running after buck clean.
    tmp = 'buck-out/gen/' + get_base_path(
    ) + '/__java_test_' + name + '_output__'
    extra_vm_args = [
        '-XX:+UseConcMarkSweepGC',  # required by -XX:+CMSClassUnloadingEnabled
        '-XX:+CMSClassUnloadingEnabled',
        '-XX:ReservedCodeCacheSize=150M',
        '-Drobolectric.dependency.dir=buck-out/gen/ReactAndroid/src/main/third-party/java/robolectric3/robolectric',
        '-Dlibraries=buck-out/gen/ReactAndroid/src/main/third-party/java/robolectric3/robolectric/*.jar',
        '-Drobolectric.logging.enabled=true',
        '-XX:MaxPermSize=620m',
        '-Drobolectric.offline=true',
    ]
    if os.path.isdir("/dev/shm") and 'CIRCLECI' not in os.environ:
        extra_vm_args.append('-Djava.io.tmpdir=/dev/shm')
    else:
        extra_vm_args.append(
            '-Djava.io.tmpdir=%s' %
            os.path.join(os.path.abspath('.'), 'buck-out/bin')
        )

    # RN tests use  Powermock, which means they get their own ClassLoaders.
    # Because the yoga native library (or any native library) can only be loaded into one
    # ClassLoader at a time, we need to run each in its own process, hence fork_mode = 'per_test'.
    native.robolectric_test(
        name=name,
        use_cxx_libraries=True,
        cxx_library_whitelist=[
            '//ReactCommon/yoga:yoga',
            '//ReactAndroid/src/main/jni/first-party/yogajni:jni',
        ],
        fork_mode='per_test',
        srcs=srcs,
        vm_args=vm_args + extra_vm_args,
        *args,
        **kwargs
    )


def cxx_library(allow_jni_merging=None, **kwargs):
    args = {
        k: v
        for k, v in kwargs.items()
        if not (k.startswith("fbandroid_") or k.startswith("fbobjc_"))
    }
    native.cxx_library(**args)


def fb_android_library(**kwargs):
    native.android_library(**kwargs)
